/*
 * @Author: Fan Dong
 * @Date: 2021-06-24 11:25:54
 * @LastEditors: Fan Dong
 * @LastEditTime: 2021-06-24 13:54:50
 * @Description: 文件描述
 * @FilePath: \learn-typescript\js\3.es5中的类和继承.js
 */

// es5中的类

// 1、最简单的类
// function Person() {
//   this.name = "张三";
//   this.age = 20;
// }

// let p = new Person();
// console.log(p.name)

// 2、构造函数和原型链里增加方法

// function Person(){
//   this.name ='张三';
//   this.age= 20;

//   this.run = function(){
//     console.log(this.name + '在运动')
//   }
// }

// 原型链上的属性会被多个实例共享，构造函数不会
// Person.prototype.sex = "男";
// Person.prototype.work = function(){
//   console.log(this.name + '在工作')
// };

// let p = new Person();
// console.log(p.name)
// p.run();
// p.work();

// 3、类里面的静态方法
// function Person(){
//   this.name ='张三';
//   this.age= 20;

//   this.run = function(){
//     console.log(this.name + '在运动')
//   }
// }
// Person.getInfo = function(){
//   console.log('我是静态方法')
// }

// 调用静态方法
// Person.getInfo()

// 4、es5中的继承 对象冒充实现继承
// function Person() {
//   this.name = "张三";
//   this.age = 20;

//   this.run = function () {
//     console.log(this.name + "在运动");
//   };
// }

// Person.prototype.sex = "男";
// Person.prototype.work = function () {
//   console.log(this.name + "在工作");
// };
// // web类继承Person 原型链+对象冒充的组合继承模式

// function Web() {
//   Person.call(this); // 对象冒充继承
// }

// let w = new Web();

// w.run() // 对象冒充可以继承构造函数里面的属性和方法
// w.work(); // 对象冒充可以继承构造函数里面的属性和方法, 但是不能继承原型链上的的属性和方法

// 5、es5中的继承 原型链实现继承
// function Person() {
//   this.name = "张三";
//   this.age = 20;

//   this.run = function () {
//     console.log(this.name + "在运动");
//   };
// }

// Person.prototype.sex = "男";
// Person.prototype.work = function () {
//   console.log(this.name + "在工作");
// };
// // web类继承Person 原型链+对象冒充的组合继承模式

// function Web() {

// }

// Web.prototype = new Person();  // 原型链实现

// let w = new Web();
// // 原型链实现继承：可以继承构造函数的属性和方法，也可以继承原型链上的属性和方法
// w.run()
// w.work()

// 6、原型链实现继承的问题
// function Person(name, age) {
//   this.name = name;
//   this.age = age;

//   this.run = function () {
//     console.log(this.name + "在运动");
//   };
// }

// Person.prototype.sex = "男";
// Person.prototype.work = function () {
//   console.log(this.name + "在工作");
// };

// // let p = new Person('李四',20);
// // p.run()

// function Web(name, age) {}
// Web.prototype = new Person();
// let w = new Web("赵四", 20);  // 实例化子类的时候没法给父类传参
// w.run();
// // let w1 = new Web("王五", 22);



// 7、原型链+构造函数的组合继承模式
// function Person(name, age) {
//   this.name = name;
//   this.age = age;

//   this.run = function () {
//     console.log(this.name + "在运动");
//   };
// }

// Person.prototype.sex = "男";
// Person.prototype.work = function () {
//   console.log(this.name + "在工作");
// };

// // let p = new Person('李四',20);
// // p.run()

// function Web(name, age) {
//   Person.call(this,name,age) //  对象冒充继承 实例化子类可以给父类传参
// }
// Web.prototype = new Person();
// let w = new Web("赵四", 20);  // 实例化子类的时候没法给父类传参
// w.run();
// w.work();



// 8、原型链+对象冒充的另一种模式
function Person(name, age) {
  this.name = name;
  this.age = age;

  this.run = function () {
    console.log(this.name + "在运动");
  };
}

Person.prototype.sex = "男";
Person.prototype.work = function () {
  console.log(this.name + "在工作");
};

// let p = new Person('李四',20);
// p.run()

function Web(name, age) {
  Person.call(this,name,age)
}
Web.prototype = Person.prototype;
let w = new Web("赵四", 20); 
w.run();
w.work();